------------------------------------------------------------------------------------
-- base/configer.lua
--
-- 这是一个配置管理器模块，主要用于读取和写入INI格式的配置文件以及与REDIS的交互操作。
--
-- @module      configer
-- @author      admin
-- @license     MIT
-- @release     v1.0.0 - 2023-03-22
-- @copyright   2023
-- @usage
-- local configer = import('base/configer')
------------------------------------------------------------------------------------

-- 模块定义
---@class configer
local configer     = {
    -- 模块版本 (主版本.次版本.修订版本)
    VERSION     = '1.0.0',
    -- 作者备注 (更新日期 - 更新内容简述)
    AUTHOR_NOTE = '2023-03-22 - Initial release',
    -- 模块名称
    MODULE_NAME = 'configer module',
    -- 只读模式
    READ_ONLY   = false,
}

-- 模块实例
local this         = configer
-- 工具函数
local utils        = utils
-- 优化列表
local os           = os
local string       = string
local tostring     = tostring
local pairs        = pairs
local setmetatable = setmetatable
local rawset       = rawset
local error        = error
local tonumber     = tonumber
local WriteString  = WriteString
local WriteString2 = WriteString2
local ReadString   = ReadString
local ReadString2  = ReadString2
local main_ctx     = main_ctx
local sys_ini_ctx  = sys_ini_ctx
local json_unit    = json_unit
local ini_ctx      = ini_ctx
local json         = import('base/json')
local dkjson       = import('base/dkjson')
-------------------------------------------------------------------------------------
-- 将指定用户的配置写入 INI 文件，并将当天日期附加到配置值之前。
--
-- @tparam       string    section          配置文件中节点名称。
-- @tparam       string    key              配置文件中的键名。
-- @tparam       string    value            要写入的字符串。
-- @treturn      boolean                    写入操作是否成功。
-- @usage
-- local section = 'user_config'
-- local key = 'user_info'
-- local value = 'John Doe'
-- local success = configer.set_window_resources_today(section, key, value)
-- print(success)
--------------------------------------------------------------------------------------
function configer.set_window_resources_today(section, key, value, file_ini)
    local content = string.format('%s,%s', os.date('%Y-%m-%d'), tostring(value))
    return configer.set_window_resources_file(section, key, content, file_ini)
end

-------------------------------------------------------------------------------------
-- 获取指定用户在当天内存储的字符串值。
--
-- @tparam       string    section          配置文件中节点名称。
-- @tparam       string    key              配置文件中键名称。
-- @treturn      string                     存储的字符串值
-- @usage
-- local value = configer.get_window_resources_today('user_config', 'user_info')
-- print(value)
-------------------------------------------------------------------------------------
function configer.get_window_resources_today(section, key, file_ini)
    local today   = os.date('%Y-%m-%d')
    local content = configer.get_window_resources_file(section, key, file_ini)
    local parts   = utils.split_string(content, ',')
    if #parts == 2 and parts[1] == today then
        return parts[2]
    end
    return ''
end

-------------------------------------------------------------------------------------
-- 将指定用户的配置写入 INI 文件，并将当月日期附加到配置值之前。
--
-- @tparam       string    section          配置文件中节点名称。
-- @tparam       string    key              配置文件中的键名。
-- @tparam       string    value            要写入的字符串。
-- @treturn      boolean                    写入操作是否成功。
-- @usage
-- local section = 'user_config'
-- local key = 'user_info'
-- local value = 'John Doe'
-- local success = configer.set_window_resources_month(section, key, value)
-- print(success)
--------------------------------------------------------------------------------------
function configer.set_window_resources_month(section, key, value, file_ini)
    local content = string.format('%s,%s', os.date('%Y-%m'), tostring(value))
    return configer.set_window_resources_file(section, key, content, file_ini)
end

-------------------------------------------------------------------------------------
-- 获取指定用户在当月内存储的字符串值。
--
-- @tparam       string    section          配置文件中节点名称。
-- @tparam       string    key              配置文件中键名称。
-- @treturn      string                     存储的字符串值
-- @usage
-- local value = configer.get_window_resources_month('user_config', 'user_info')
-- print(value)
-------------------------------------------------------------------------------------
function configer.get_window_resources_month(section, key, file_ini)
    local today   = os.date('%Y-%m')
    local content = configer.get_window_resources_file(section, key, file_ini)
    local parts   = utils.split_string(content, ',')
    if #parts == 2 and parts[1] == today then
        return parts[2]
    end
    return ''
end

------------------------------------------------------------------------------------
-- data 写入数据 C:\\Windows\\Resources\\AbgzjMEE@connect.wwfjp.org_EAST201_Knight
function configer.set_window_resources_file(section, key, str, file_ini)
    local file = [[C:\Windows\Resources\]] .. (file_ini or main_ctx:c_account() .. '_' .. main_ctx:c_server_name() .. '.ini')
    return configer.set_profile_ex(file, section, key, str)
end

------------------------------------------------------------------------------------
-- data 写入数据 C:\\Windows\\Resources\\AbgzjMEE@connect.wwfjp.org_EAST201_Knight
function configer.set_window_resources_file2(tab_section_key, file_ini)
    local file = [[C:\Windows\Resources\]] .. (file_ini or main_ctx:c_account() .. '_' .. main_ctx:c_server_name() .. '.ini')
    return configer.set_profile_ex2(file, tab_section_key)
end

------------------------------------------------------------------------------------
-- data 写入数据 C:\\Windows\\Resources\\AbgzjMEE@connect.wwfjp.org_EAST201_Knight
function configer.get_window_resources_file(section, key, file_ini)
    local file = [[C:\Windows\Resources\]] .. (file_ini or main_ctx:c_account() .. '_' .. main_ctx:c_server_name() .. '.ini')
    return configer.get_profile_ex(file, section, key)
end

------------------------------------------------------------------------------------
-- 向指定路径的节点写入文本记录
function configer.set_profile_ex(file, section, key, str)
    -- 清空 INI 之前保留的数据
    ini_ctx:clear()

    -- 从文件加载 INI 数据
    local load_success = ini_ctx:load_file(file)

    -- 没有加载成功
    if not load_success then
        --     xxxmsg(4, '1.Failed to load file.')
    end

    -- 设置数据
    ini_ctx:set_string(section .. ':' .. key, str)

    -- 保存数据
    return ini_ctx:save(file) -- main_ctx:utf8_to_ansi()
end

------------------------------------------------------------------------------------
-- 向指定路径的节点写入文本记录
function configer.set_profile_ex2(file, tab_section_key)
    -- 清空 INI 之前保留的数据
    ini_ctx:clear()

    -- 从文件加载 INI 数据
    local load_success = ini_ctx:load_file(file)

    -- 没有加载成功
    if not load_success then
        --     xxxmsg(4, '1.Failed to load file.')
    end
    for _, v in ipairs(tab_section_key) do
        -- 设置数据
        ini_ctx:set_string(v.section .. ':' .. v.key, v.value)
    end

    -- 保存数据
    return ini_ctx:save(file) -- main_ctx:utf8_to_ansi()
end

------------------------------------------------------------------------------------
-- 读取指定路径的节点信息
function configer.get_profile_ex(file, section, key)
    -- 清空 INI 之前保留的数据
    ini_ctx:clear()

    -- 从文件加载 INI 数据
    local load_success = ini_ctx:load_file(file)

    -- 没有加载成功 返回 ''
    if not load_success then
        --     xxxmsg(4, '2.Failed to load file.')
        return ''
    end

    -- xxxmsg(2, '2.Loading file successful.')
    return ini_ctx:get_string(section .. ':' .. key)
end

------------------------------------------------------------------------------------
-- 写入配置文件的指定字段值。
--
-- @tparam       string    file             配置文件路径
-- @tparam       string    section          配置文件中的区段名称
-- @tparam       string    key              区段中的字段名称
-- @tparam       string    str              要写入的字符串
-- @treturn      boolean                    是否写入成功
-- @usage
-- local configer = import('base/configer')
-- configer.set_profile('本机设置.ini', '区段名称', '字段名称', '字符串内容')
------------------------------------------------------------------------------------
function configer.set_profile(file, section, key, str)
    --file      = string.format('%s%s', main_ctx:c_fz_path(), file)
    --return configer.set_profile_ex(file, section, key, str)

    file = main_ctx:utf8_to_ansi(file)
    -- section = main_ctx:utf8_to_ansi(section)
    -- key = main_ctx:utf8_to_ansi(key)
    -- str = main_ctx:utf8_to_ansi(str)
    return WriteString2(file, section, key, str)
end

------------------------------------------------------------------------------------
-- 获取配置文件中的指定字段值。
--
-- @tparam       string    file             配置文件路径
-- @tparam       string    section          配置文件中的区段名称
-- @tparam       string    key              区段中的字段名称
-- @treturn      string                     如果找到指定字段值，返回该值。否则返回''。
-- @usage
-- local configer = import('base/configer')
-- local str = configer.get_profile('本机设置.ini', '区段名称', '字段名称')
-- xxxmsg(2, str)
------------------------------------------------------------------------------------
function configer.get_profile(file, section, key)
    --file      = string.format('%s%s', main_ctx:c_fz_path(), file)
    --return configer.get_profile_ex(file, section, key)

    file = main_ctx:utf8_to_ansi(file)
    --section = main_ctx:utf8_to_ansi(section)
    --key     = main_ctx:utf8_to_ansi(key)
    return ReadString2(file, section, key)
end

------------------------------------------------------------------------------------
-- 写入用户配置的指定字段值。
--
-- @tparam       string    section          用户配置文件中的区段名称
-- @tparam       string    key              区段中的字段名称
-- @tparam       string    str              要写入的字符串
-- @treturn      boolean                    是否写入成功
-- @usage
-- local configer = import('base/configer')
-- configer.set_user_profile('区段名称', '字段名称', '字符串内容')
------------------------------------------------------------------------------------
function configer.set_user_profile(section, key, str, other_path)
    --local file = string.format('%sProfile\\%s', main_ctx:c_fz_path(), other_path or main_ctx:c_account()..'.ini')
    --configer.set_profile_ex(file, section, key, str)

    --section = main_ctx:utf8_to_ansi(section)
    --key = main_ctx:utf8_to_ansi(key)
    -- str = main_ctx:utf8_to_ansi(str) -- 写入字符转换
    return WriteString(section, key, str)
end

------------------------------------------------------------------------------------
-- 获取用户配置文件中的指定字段值。
--
-- @tparam       string    section          用户配置文件中的区段名称
-- @tparam       string    key              区段中的字段名称
-- @treturn      string                     如果找到指定字段值，返回该值。否则返回''。
-- @usage
-- local configer = import('base/configer')
-- local str = configer.get_user_profile('区段名称', '字段名称')
-- xxxmsg(2, str)
------------------------------------------------------------------------------------
function configer.get_user_profile(section, key, other_path)
    --local file = string.format('%sProfile\\%s.ini', main_ctx:c_fz_path(), other_path or main_ctx:c_account())
    --return configer.get_profile_ex(file, section, key)

    --section = main_ctx:utf8_to_ansi(section)
    --key = main_ctx:utf8_to_ansi(key)
    -- xxmsg( ReadString(section, key) )
    return ReadString(section, key) --main_ctx:ansi_to_utf8(ReadString(section, key))
end

------------------------------------------------------------------------------------
-- 写入带有过期时间的用户配置。
--
-- @tparam       string    section          配置文件中的 section 名称
-- @tparam       string    key              配置文件中的 key 名称
-- @tparam       string    value            配置文件中的 value 值
-- @tparam       number    expire_seconds   配置过期时间（秒）
-- @treturn      boolean                    写入是否成功
-- @usage
-- -- 设置登录用户信息有效期为一天
-- local name = 'John Doe'
-- local expire_seconds = 86400
-- configer.set_user_profile_expire('user', 'name', name, expire_seconds)
------------------------------------------------------------------------------------
function configer.set_user_profile_expire(section, key, value, expire_seconds)
    if expire_seconds <= 0 then
        return false
    end
    local expire_time = utils.convert_datetime(os.time() + expire_seconds)
    local content = string.format('%s,%s', expire_time, tostring(value))
    return configer.set_user_profile(section, key, content)
end

------------------------------------------------------------------------------------
--  获取带有过期时间的用户配置。
--
-- @tparam       string    section          配置文件中节点名称。
-- @tparam       string    key              配置文件中键名称。
-- @treturn      string                     配置值（如果未过期），否则返回空字符串
-- @usage
-- -- 配置文件中内容：name = '1646547599,John Doe'
-- local name = configer.get_user_profile_expire('user', 'name')
-- if name ~= '' then
--     print('欢迎回来，' .. name .. '!')
-- else
--     print('您还未登录')
-- end
------------------------------------------------------------------------------------
function configer.get_user_profile_expire(section, key)
    local content = configer.get_user_profile(section, key)
    if content ~= '' then
        local parts = utils.split_string(content, ',')
        if #parts == 2 then
            local timestamp = utils.convert_timestamp(parts[1])
            if timestamp and timestamp > os.time() then
                return parts[2]
            end
        end
    end
    return ''
end

-------------------------------------------------------------------------------------
--- 将指定用户的配置写入 INI 文件，
--
-- @tparam       string    section          配置文件中节点名称。
-- @tparam       string    key              配置文件中的键名。
-- @tparam       string    value            要写入的字符串。
-- @treturn      boolean                    写入操作是否成功。
-- @usage
-- local section = 'user_config'
-- local key = 'user_info'
-- local value = 'John Doe'
-- local success = configer.set_user_profile_week(section, key, value)
-- print(success)
--------------------------------------------------------------------------------------
function configer.set_user_profile_week(section, key, value)
    return configer.set_user_profile_expire(section, key, value, utils.get_week_timestamp() - os.time())
end

-------------------------------------------------------------------------------------
-- 获取本周记录
--
-- @tparam       string    section          配置文件中节点名称。
-- @tparam       string    key              配置文件中键名称。
-- @treturn      string                     存储的字符串值
-- @usage
-- local value = configer.get_user_profile_week('user_config', 'user_info')
-- print(value)
-------------------------------------------------------------------------------------
function configer.get_user_profile_week(section, key)
    return configer.get_user_profile_expire(section, key)
end

-------------------------------------------------------------------------------------
-- 将指定用户的配置写入 INI 文件，并将当天日期附加到配置值之前。
--
-- @tparam       string    section          配置文件中节点名称。
-- @tparam       string    key              配置文件中的键名。
-- @tparam       string    value            要写入的字符串。
-- @treturn      boolean                    写入操作是否成功。
-- @usage
-- local section = 'user_config'
-- local key = 'user_info'
-- local value = 'John Doe'
-- local success = configer.set_user_profile_today(section, key, value)
-- print(success)
--------------------------------------------------------------------------------------
function configer.set_user_profile_today(section, key, value)
    local content = string.format('%s,%s', os.date('%Y-%m-%d'), tostring(value))
    return configer.set_user_profile(section, key, content)
end

-------------------------------------------------------------------------------------
-- 获取指定用户在当天内存储的字符串值。
--
-- @tparam       string    section          配置文件中节点名称。
-- @tparam       string    key              配置文件中键名称。
-- @treturn      string                     存储的字符串值
-- @usage
-- local value = configer.get_user_profile_today('user_config', 'user_info')
-- print(value)
-------------------------------------------------------------------------------------
function configer.get_user_profile_today(section, key)
    local today = os.date('%Y-%m-%d')
    local content = configer.get_user_profile(section, key)
    local parts = utils.split_string(content, ',')
    if #parts == 2 and parts[1] == today then
        return parts[2]
    end
    return ''
end

-------------------------------------------------------------------------------------
-- 将指定用户的配置写入 INI 文件，并将当天日期附加到配置值之前。
--
-- @tparam       string    section          配置文件中节点名称。
-- @tparam       string    key              配置文件中的键名。
-- @tparam       string    value            要写入的字符串。
-- @treturn      boolean                    写入操作是否成功。
-- @usage
-- local section = 'user_config'
-- local key = 'user_info'
-- local value = 'John Doe'
-- local success = configer.set_user_profile_today_and_nextday_hour(section, key, value)
-- print(success)
--------------------------------------------------------------------------------------
function configer.set_user_profile_today_and_nextday_hour(section, key, value)
    if value == '' then
        return configer.set_user_profile(section, key, value)
    end
    local content = string.format('%s,%s', utils.convert_datetime(os.time()), tostring(value))
    return configer.set_user_profile(section, key, content)
end

-------------------------------------------------------------------------------------
-- 获取指定用户在当日与下日指定时间范围内的配置值
--
-- @tparam       string    section          配置文件中节点名称。
-- @tparam       string    key              配置文件中键名称。
-- @treturn      string                     存储的字符串值
-- @usage
-- local value = configer.get_user_profile_today_and_nextday_hour('user_config', 'user_info')
-- print(value)
-------------------------------------------------------------------------------------
function configer.get_user_profile_today_and_nextday_hour(section, key)
    local content = configer.get_user_profile(section, key)
    --xxmsg(section..' '..key..' 1. '..content)
    local parts = utils.split_string(content, ',')
    --xxmsg(section..' '..key..' 2. '..content)
    if #parts == 2 and parts[1] and utils.is_in_times(utils.convert_timestamp(parts[1]), 4) then
        --xxmsg(section..' ---- '..key..' '..content..' '..utils.convert_timestamp(parts[1])..' '..tostring(utils.is_in_times(utils.convert_timestamp(parts[1]),4)))
        return parts[2]
    end
    return ''
end

------------------------------------------------------------------------------------
--  获取带有过期时间的用户配置。
--
-- @tparam       string    section          配置文件中节点名称。
-- @tparam       string    key              配置文件中键名称。
-- @treturn      string                     配置值（如果未过期），否则返回空字符串
-- @usage
-- -- 配置文件中内容：name = '1646547599,John Doe'
-- local name = configer.get_user_profile_expire('user', 'name')
-- if name ~= '' then
--     print('欢迎回来，' .. name .. '!')
-- else
--     print('您还未登录')
-- end
------------------------------------------------------------------------------------
function configer.get_user_profile_today_and_time(section, key, time)
    local content = configer.get_user_profile(section, key)
    if content ~= '' then
        local parts = utils.split_string(content, ',')
        if #parts == 2 and parts[1] and tonumber(parts[1]) then
            if tonumber(parts[1]) + time > os.time() then
                return parts[2]
            end
        end
    end
    return ''
end

------------------------------------------------------------------------------------
-- 是否已记录指定值
--
-- @tparam       string    file             配置文件路径
-- @tparam       string    section          配置文件中节点名称。
-- @tparam       string    need_value       需要与配置值配对的参数。
-- @tparam       number    queue_num        可写的总序列数。
-- @treturn      number                     返回是need_value中对应的队列 0表示没有记录
-- @treturn      number                     指定队列下已找到的记录数
-- @usage
--
function configer.is_exist_key(file, section, need_value, queue_num)
    queue_num       = queue_num or 1
    -- 找到自身记录数据
    local find_idx  = 0
    -- 已存在记录数据
    local exist_num = 0
    -- 可写位置
    local can_idx   = 0
    for i = 1, queue_num do
        local read = configer.get_profile_expire(file, section, i)
        if read ~= '' then
            if need_value == read and find_idx == 0 then
                find_idx = i
            end
            exist_num = exist_num + 1
        else
            if can_idx == 0 then
                can_idx = i
            end
        end
    end
    return find_idx, exist_num, can_idx
end

------------------------------------------------------------------------------------
-- 记录数据
--
-- @tparam       string    file             配置文件路径
-- @tparam       string    section          配置文件中节点名称。
-- @tparam       string    need_value       需要与配置值配对的参数。
-- @tparam       number    queue_num        可写的总序列数。
-- @tparam       number    expire_time      0时清空自身记录
-- @treturn      number                     指定队列下已找到的记录数
-- @usage
--
function configer.set_profile_expire_queue(file, section, need_value, queue_num, expire_time)
    queue_num                          = queue_num or 1
    local find_idx, exist_num, can_idx = configer.is_exist_key(file, section, need_value, queue_num)
    -- 清除数据
    if expire_time == 0 then
        if find_idx > 0 then
            configer.set_profile(file, section, find_idx, '')
            return exist_num - 1
        end
        return exist_num
    end
    if find_idx == 0 then
        find_idx = can_idx
    end
    if find_idx > 0 and need_value ~= '' then
        configer.set_profile_expire(file, section, find_idx, need_value, expire_time)
    end
    return exist_num
end

------------------------------------------------------------------------------------
-- 写入带有过期时间的用户配置。
--
-- @tparam       string    file             配置文件路径
-- @tparam       string    section          配置文件中的 section 名称
-- @tparam       string    key              配置文件中的 key 名称
-- @tparam       string    value            配置文件中的 value 值
-- @tparam       number    expire_seconds   配置过期时间（秒）
-- @treturn      boolean                    写入是否成功
-- @usage

------------------------------------------------------------------------------------
function configer.set_profile_expire(file, section, key, value, expire_seconds)
    if expire_seconds <= 0 then
        return false
    end
    local expire_time = utils.convert_datetime(os.time() + expire_seconds)
    local content = string.format('%s,%s', expire_time, tostring(value))
    return configer.set_profile(file, section, key, content)
end

------------------------------------------------------------------------------------
--  获取带有过期时间的用户配置。
--
-- @tparam       string    file             配置文件路径
-- @tparam       string    section          配置文件中节点名称。
-- @tparam       string    key              配置文件中键名称。
-- @treturn      string                     配置值（如果未过期），否则返回空字符串
-- @usage
--
------------------------------------------------------------------------------------
function configer.get_profile_expire(file, section, key)
    local content = configer.get_profile(file, section, key)
    if content ~= '' then
        local parts = utils.split_string(content, ',')
        if #parts == 2 and parts[1] then
            local timestamp = utils.convert_timestamp(parts[1])
            if timestamp and timestamp > os.time() then
                return parts[2]
            end
        end
    end
    return ''
end

-------------------------------------------------------------------------------------
-- 将指定用户的配置写入 INI 文件，并将当天日期附加到配置值之前。
--
-- @tparam       string    file             配置文件路径
-- @tparam       string    section          配置文件中节点名称。
-- @tparam       string    key              配置文件中的键名。
-- @tparam       string    value            要写入的字符串。
-- @treturn      boolean                    写入操作是否成功。
-- @usage
--
--------------------------------------------------------------------------------------
function configer.set_profile_today(file, section, key, value)
    local content = string.format('%s,%s', os.date('%Y-%m-%d'), tostring(value))
    return configer.set_profile(file, section, key, content)
end

-------------------------------------------------------------------------------------
-- 获取指定用户在当天内存储的字符串值。
--
-- @tparam       string    file             配置文件路径
-- @tparam       string    section          配置文件中节点名称。
-- @tparam       string    key              配置文件中键名称。
-- @treturn      string                     存储的字符串值
-- @usage
--
-------------------------------------------------------------------------------------
function configer.get_profile_today(file, section, key)
    local today = os.date('%Y-%m-%d')
    local content = configer.get_profile(file, section, key)
    local parts = utils.split_string(content, ',')
    if #parts == 2 and parts[1] == today then
        return parts[2]
    end
    return ''
end

-------------------------------------------------------------------------------------
-- 将指定用户的配置写入 INI 文件，并将当天日期附加到配置值之前。
--
-- @tparam       string    file             配置文件路径
-- @tparam       string    section          配置文件中节点名称。
-- @tparam       string    key              配置文件中的键名。
-- @tparam       string    value            要写入的字符串。
-- @treturn      boolean                    写入操作是否成功。
-- @usage
--
--------------------------------------------------------------------------------------
function configer.set_profile_today_and_nextday_hour(file, section, key, value)
    local content = string.format('%s,%s', os.time(), tostring(value))
    return configer.set_profile(file, section, key, content)
end

-------------------------------------------------------------------------------------
-- 获取指定用户在当日与下日指定时间范围内的配置值
--
-- @tparam       string    file             配置文件路径
-- @tparam       string    section          配置文件中节点名称。
-- @tparam       string    key              配置文件中键名称。
-- @treturn      string                     存储的字符串值
-- @usage
--
-------------------------------------------------------------------------------------
function configer.get_profile_today_and_nextday_hour(file, section, key, hour)
    local content = configer.get_profile(file, section, key)
    local parts = utils.split_string(content, ',')
    if #parts == 2 and parts[1] and tonumber(parts[1]) and utils.is_in_times(tonumber(parts[1]), hour) then
        return parts[2]
    end
    return ''
end

------------------------------------------------------------------------------------
--  获取带有过期时间的用户配置。
--
-- @tparam       string    file             配置文件路径
-- @tparam       string    section          配置文件中节点名称。
-- @tparam       string    key              配置文件中键名称。
-- @treturn      string                     配置值（如果未过期），否则返回空字符串
-- @usage
--
------------------------------------------------------------------------------------
function configer.get_profile_today_and_time(file, section, key, time)
    local content = configer.get_profile(file, section, key)
    if content ~= '' then
        local parts = utils.split_string(content, ',')
        if #parts == 2 and parts[1] and tonumber(parts[1]) then
            if tonumber(parts[1]) + time > os.time() then
                return parts[2]
            end
        end
    end
    return ''
end

------------------------------------------------------------------------------------
-- [写入] 写入数据结构-表到文本记录
function configer.set_profile_data(file, section, key, data)
    local json_text = json.encode(data)
    if string.len(json_text) > 0 then
        return configer.set_profile(file, section, key, json_text)
    end
    return false
end

------------------------------------------------------------------------------------
-- [读取] 读取数据结构到表
function configer.get_profile_data(file, section, key)
    local content = configer.get_profile(file, section, key)
    -- xxmsg(content)
    return content and content ~= '' and json_unit.decode(content) or {}
end

------------------------------------------------------------------------------------
-- 添加不重复数据到配置
-- 参数: file(文件), section(节), data(数据表)
-- 返回: (key名称, 是否成功写入, 错误信息)
function configer.add_profile_data_unique(file, section, data)
    local first_empty_index = nil
    local target_task = data.task_name

    for index = 1, 20 do
        local key_name = index
        local content = configer.get_profile_data(file, section, key_name)

        -- 检查重复数据
        if next(content) ~= nil then
            if content.task_name == target_task then
                return key_name, false, "重复任务已存在"
            end
            -- 记录首个空位
        elseif not first_empty_index then
            first_empty_index = index
        end
    end

    -- 所有位置已满
    if not first_empty_index then
        return nil, false, "所有序号位置已满"
    end

    -- 写入首个空位
    local new_key = first_empty_index
    local success = configer.set_profile_data(file, section, new_key, data)
    return new_key, success, success and "写入成功" or "写入失败"
end

------------------------------------------------------------------------------------
-- 根据限制的写入操作
local restrict_list = {
    ['once'] = { get_func = configer.get_user_profile, set_func = configer.set_user_profile },
    ['day'] = { get_func = configer.get_user_profile_today, set_func = configer.set_user_profile_today },
    ['week'] = { get_func = configer.get_user_profile_week, set_func = configer.set_user_profile_week },
    ['month'] = { get_func = configer.get_window_resources_month, set_func = configer.set_window_resources_month },
}

------------------------------------------------------------------------------------
-- [条件] 根据时间的限制
function configer.get_ok_restrict(restrict, section, key)
    if not restrict_list[restrict] then
        return ''
    end

    return restrict_list[restrict].get_func(section, key)
end

------------------------------------------------------------------------------------
-- [读写] 根据时间限制的写入
function configer.set_ok_restrict(restrict, section, key, value)
    if not restrict_list[restrict] then
        return false
    end

    return restrict_list[restrict].set_func(section, key, value)
end

------------------------------------------------------------------------------------
-- 读ini
function configer.read_ini_to_data(path, session, key)
    sys_ini_ctx:clear()
    path = main_ctx:utf8_to_ansi(path)
    -- 从文件加载 INI 数据
    local load_success = sys_ini_ctx:load_file(path)
    if not load_success then
        return {}
    end

    local str = ''

    if session and key then
        str = sys_ini_ctx:get_string(session..':'..key)
    else
        str = sys_ini_ctx:to_string()
    end

    local ret = json_unit.decode(str) or {}

    return ret
end

------------------------------------------------------------------------------------
-- 读取配置文件中 json格式 转换成 表
function configer.read_config_to_data(path)
    path            = main_ctx:utf8_to_ansi(path)
    local file, err = io.open(path, 'r')
    assert(file, err)
    local str = file:read('*a')
    -- xxmsg(str)
    file:close()
    local ret = json_unit.decode(str)
    return ret
end

------------------------------------------------------------------------------------
-- 将对象转换为字符串
--
-- @local
-- @treturn      string                     模块名称
------------------------------------------------------------------------------------
function configer.__tostring()
    return this.MODULE_NAME
end

------------------------------------------------------------------------------------
-- 防止动态修改(this.READ_ONLY值控制)
--
-- @local
-- @tparam       table     t                被修改的表
-- @tparam       any       k                要修改的键
-- @tparam       any       v                要修改的值
------------------------------------------------------------------------------------
function configer.__newindex(t, k, v)
    if this.READ_ONLY then
        error('attempt to modify read-only table')
        return
    end
    rawset(t, k, v)
end

------------------------------------------------------------------------------------
-- 设置utils的__index元方法指向自身
--
-- @local
------------------------------------------------------------------------------------
configer.__index = configer

------------------------------------------------------------------------------------
-- 创建一个新的实例
--
-- @local
-- @tparam       table     args             可选参数，用于初始化新实例
-- @treturn      table                      新创建的实例
------------------------------------------------------------------------------------
function configer:new(args)
    local new = {}
    -- 预载函数(重载脚本时)
    if this.super_preload then
        this.super_preload()
    end
    -- 将args中的键值对复制到新实例中
    if args then
        for key, val in pairs(args) do
            new[key] = val
        end
    end
    -- 设置元表
    return setmetatable(new, configer)
end

------------------------------------------------------------------------------------
-- 返回实例对象
------------------------------------------------------------------------------------
return configer:new()

------------------------------------------------------------------------------------
